package reflect;

import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.net.URISyntaxException;

/**
 * 自动调用reflect包中所有类的公开的本类自己定义的无参方法
 */
public class Test03 {
    public static void main(String[] args) throws URISyntaxException, ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException {
        //相对路径中的"./"位置视运行环境而定,因此开发中会变化,原则上少采用.
//        File file = new File("./src/reflect");

        //实际开发中,我们通常使用类加载路径
        //下面定位的是Test03这个类所在的目录(Test03.class文件所在的目录)
        File dir = new File(
                Test03.class.getResource(".").toURI()
        );
        String path = dir.getAbsolutePath();//获取该目录的绝对路径
        System.out.println(path);

        //获取Test03.class这个目录中所有的class文件
        File[] subs = dir.listFiles(f->f.getName().endsWith(".class"));
        for(File sub : subs){
            String fileName = sub.getName();//获取文件名,例如:Test03.class
            String className = fileName.substring(0,fileName.indexOf("."));//Test03
            System.out.println(className);
            Class cls = Class.forName("reflect."+className);//"reflect.Test03"
            Object o = cls.newInstance();
            Method[] methods = cls.getDeclaredMethods();
            for(Method m : methods){
                if(m.getParameterCount()==0 //判断是否无参
                        &&m.getModifiers()!= Modifier.PRIVATE//判断不是私有方法
                ){
                    System.out.println("执行方法:"+m.getName()+"()");
                    m.invoke(o);
                }
            }
        }
    }
}
